###########################################
#
#  Super Octogon
#
#  Use A/D or Left/Right to rotate.
#  Don't touch the segments!
#
#  Currently runs best at ~200 cycles/frame.
#  Needs 16x16 sprite drawing in
#  lores mode, and is otherwise completely
#  compatible with SCHIP; it should work
#  in most modern SCHIP interpreters.
#
#  by John Earnest
#  An entry for the 2021 Octojam 8.
#
###########################################

# register map:

# v0 - v3               # reserved as temporaries
:alias pattern       v4 # current pattern (cache)
:alias pattern-index v5 # index into patterns
:alias player        v6 # pre-multiplied * 2
# v7 - vE               # ring shift registers
# vF                    # reserved as temporary

: waves 0x00
: wave-digits 0 0 0

: title-A
	0xEA 0xEE 0xEA 0xEE 0x8A 0xA8 0xEA 0xEC 0x2A 0x88 0xEE 0x8E 0xEE 0x8E 0x00 0x00
	0xEE 0xEE 0xEE 0xEE 0xAA 0x4A 0xA8 0x4A 0xAA 0x4A 0xEE 0x4E 0xEE 0x4E 0x00 0x00
: title-B
	0xE0 0x00 0xE0 0x00 0xA0 0x00 0xC0 0x00 0xA0 0x00 0xA0 0x00 0xA0 0x00 0x00 0x00
	0xE3 0x18 0xE7 0x9C 0x8F 0xDC 0xAF 0xD4 0xAF 0xD4 0xE7 0x94 0xE3 0x14 0x00 0x00

: pixel 0x80 # a single pixel
: reset-registers
: octagon-start
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # N
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x80 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # NE
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 # E
	0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # SE
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x01 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # S
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # SW
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 # W
	0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # NW
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00

: octagon-move
# 8x 16x16 pre-xored frames
# 0 - north (24,0)
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xC0 0x01 0x80 0x01 0x80 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x07 0xE0 0x03 0xC0 0x03 0xC0 0x01 0x80 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x0F 0xF0 0x07 0xE0 0x07 0xE0 0x03 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x1F 0xF8 0x0F 0xF0
	0x0F 0xF0 0x07 0xE0 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x3F 0xFC 0x1F 0xF8 0x1F 0xF8 0x0F 0xF0
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x7F 0xFE 0x3F 0xFC 0x3F 0xFC 0x1F 0xF8 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0xFF 0xFF 0x7F 0xFE 0x7F 0xFE 0x3F 0xFC 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0xFF 0xFF 0x7F 0xFE 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
# 1 - northeast (32,0)
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x60 0x00 0x60 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x30 0x00 0x38 0x00 0x78 0x00 0x20 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x18 0x00 0x1C 0x00 0x3E 0x00 0x3E 0x00 0x18 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0C 0x00
	0x0E 0x00 0x1F 0x00 0x1F 0x80 0x0F 0x80 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x06 0x00 0x07 0x00 0x0F 0x80
	0x0F 0xC0 0x07 0xE0 0x03 0xE0 0x01 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x03 0x00 0x03 0x80 0x07 0xC0 0x07 0xE0 0x03 0xF0
	0x01 0xF8 0x00 0xF8 0x00 0x60 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x01 0x80 0x01 0xC0 0x03 0xE0 0x03 0xF0 0x01 0xF8 0x00 0xFC 0x00 0x7E
	0x00 0x3E 0x00 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x01 0x80 0x01 0xC0 0x00 0xE0 0x00 0x70 0x00 0x38 0x00 0x1C 0x00 0x0E
	0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
# 2 - east (32,8)
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x00 0x70 0x00
	0x70 0x00 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x1C 0x00 0x3C 0x00
	0x3C 0x00 0x1C 0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x07 0x00 0x0F 0x00 0x0F 0x00
	0x0F 0x00 0x0F 0x00 0x07 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x01 0xC0 0x03 0xC0 0x03 0xC0 0x03 0xC0
	0x03 0xC0 0x03 0xC0 0x03 0xC0 0x01 0xC0 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x10 0x00 0x70 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0
	0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0x70 0x00 0x10 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x04 0x00 0x1C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C
	0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x1C 0x00 0x04 0x00 0x00
	0x00 0x01 0x00 0x07 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F
	0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x07 0x00 0x01
	0x00 0x01 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03
	0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x03 0x00 0x01
# 3 - southeast (32,16)
	0x00 0x00 0x60 0x00 0x60 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x20 0x00 0x78 0x00 0x38 0x00 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x18 0x00 0x3E 0x00 0x3E 0x00 0x1C 0x00 0x18 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x06 0x00 0x0F 0x80 0x1F 0x80 0x1F 0x00 0x0E 0x00
	0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x80 0x03 0xE0 0x07 0xE0 0x0F 0xC0
	0x0F 0x80 0x07 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x60 0x00 0xF8 0x01 0xF8
	0x03 0xF0 0x07 0xE0 0x07 0xC0 0x03 0x80 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x18 0x00 0x3E
	0x00 0x7E 0x00 0xFC 0x01 0xF8 0x03 0xF0 0x03 0xE0 0x01 0xC0 0x01 0x80 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x06
	0x00 0x0E 0x00 0x1C 0x00 0x38 0x00 0x70 0x00 0xE0 0x01 0xC0 0x01 0x80 0x00 0x00
# 4 - south (24,16)
	0x00 0x00 0x01 0x80 0x01 0x80 0x03 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x01 0x80 0x03 0xC0 0x03 0xC0 0x07 0xE0 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xC0 0x07 0xE0 0x07 0xE0 0x0F 0xF0
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x07 0xE0 0x0F 0xF0
	0x0F 0xF0 0x1F 0xF8 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x0F 0xF0 0x1F 0xF8 0x1F 0xF8 0x3F 0xFC 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x1F 0xF8 0x3F 0xFC 0x3F 0xFC 0x7F 0xFE 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x3F 0xFC 0x7F 0xFE 0x7F 0xFE 0xFF 0xFF
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7F 0xFE 0xFF 0xFF
# 5 - southwest (16,16)
	0x00 0x00 0x00 0x06 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x04 0x00 0x1E 0x00 0x1C 0x00 0x0C 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x18 0x00 0x7C 0x00 0x7C 0x00 0x38 0x00 0x18 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x60 0x01 0xF0 0x01 0xF8 0x00 0xF8 0x00 0x70
	0x00 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x80 0x07 0xC0 0x07 0xE0 0x03 0xF0
	0x01 0xF0 0x00 0xE0 0x00 0x60 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x06 0x00 0x1F 0x00 0x1F 0x80
	0x0F 0xC0 0x07 0xE0 0x03 0xE0 0x01 0xC0 0x00 0xC0 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x18 0x00 0x7C 0x00
	0x7E 0x00 0x3F 0x00 0x1F 0x80 0x0F 0xC0 0x07 0xC0 0x03 0x80 0x01 0x80 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x60 0x00
	0x70 0x00 0x38 0x00 0x1C 0x00 0x0E 0x00 0x07 0x00 0x03 0x80 0x01 0x80 0x00 0x00
# 6 - west (16,8)
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x08 0x00 0x0E
	0x00 0x0E 0x00 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x20 0x00 0x38 0x00 0x3C
	0x00 0x3C 0x00 0x38 0x00 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x00 0xE0 0x00 0xF0 0x00 0xF0
	0x00 0xF0 0x00 0xF0 0x00 0xE0 0x00 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x03 0x80 0x03 0xC0 0x03 0xC0 0x03 0xC0
	0x03 0xC0 0x03 0xC0 0x03 0xC0 0x03 0x80 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x08 0x00 0x0E 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00
	0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0F 0x00 0x0E 0x00 0x08 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x20 0x00 0x38 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00
	0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x3C 0x00 0x38 0x00 0x20 0x00 0x00 0x00
	0x80 0x00 0xE0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00
	0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xF0 0x00 0xE0 0x00 0x80 0x00
	0x80 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00
	0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00 0x80 0x00
# 7 - northwest (16,0)
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x06 0x00 0x06 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0C 0x00 0x1C 0x00 0x1E 0x00 0x04 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x18 0x00 0x38 0x00 0x7C 0x00 0x7C 0x00 0x18 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x30
	0x00 0x70 0x00 0xF8 0x01 0xF8 0x01 0xF0 0x00 0x60 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x60 0x00 0xE0 0x01 0xF0
	0x03 0xF0 0x07 0xE0 0x07 0xC0 0x01 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 0x01 0xC0 0x03 0xE0 0x07 0xE0 0x0F 0xC0
	0x1F 0x80 0x1F 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x01 0x80 0x03 0x80 0x07 0xC0 0x0F 0xC0 0x1F 0x80 0x3F 0x00 0x7E 0x00
	0x7C 0x00 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x01 0x80 0x03 0x80 0x07 0x00 0x0E 0x00 0x1C 0x00 0x38 0x00 0x70 0x00
	0x60 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

# patterns are allowed to randomly interleave every 32 steps:
: patterns-A
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x88 0x00 0x00 0x88 0x00 0x00 0x00 0x00 0x44 0x00 0x00 0x44 0x00 0x00 0x00 0x00 # slow pairs A
	0x11 0x00 0x00 0x11 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x22 0x00 0x00 0x00 0x00 # slow pairs B
	0x80 0x00 0x00 0x20 0x00 0x00 0x00 0x08 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00 # slow singles
	0x80 0x40 0x20 0x10 0x08 0x04 0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # single spin cw
	0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # single spin ccw
	0x77 0x00 0x00 0x00 0x77 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 2-hole A
	0xDD 0x00 0x00 0x00 0xDD 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 2-hole B
	0x6F 0x00 0x00 0x6F 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # L-hole A
	0xB7 0x00 0x00 0xB7 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # L-hole B
	0xED 0x00 0x00 0xED 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # L-hole C
	0x7B 0x00 0x00 0x7B 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # L-hole D
	0x80 0x00 0x20 0x00 0x08 0x00 0x02 0x40 0x00 0x10 0x00 0x04 0x00 0x01 0x00 0x00 # fast singles
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x88 0x44 0x22 0x00 0x00 0x44 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # double spin cw
	0x11 0x22 0x44 0x00 0x11 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # double spin ccw
: patterns-B
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x44 0x00 0x00 0x44 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x22 0x00 0x00 0x00 0x00 # slow pairs A
	0x11 0x00 0x00 0x11 0x00 0x00 0x00 0x00 0x88 0x00 0x00 0x88 0x00 0x00 0x00 0x00 # slow pairs B
	0x02 0x00 0x00 0x08 0x00 0x00 0x00 0x20 0x00 0x00 0x00 0x80 0x00 0x00 0x00 0x00 # slow singles
	0x36 0x00 0x00 0x36 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 4-hole A
	0xB1 0x00 0x00 0xB1 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 4-hole B
	0xD8 0x00 0x00 0xD8 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 4-hole C
	0xC6 0x00 0x00 0xC6 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 4-hole D
	0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # single spin ccw
	0x80 0x40 0x20 0x10 0x08 0x04 0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # single spin cw
	0xC0 0x00 0x00 0x00 0x1C 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 2-hole A
	0x1C 0x00 0x00 0x00 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # 2-hole B
	0x40 0x00 0x10 0x00 0x04 0x00 0x01 0x02 0x00 0x08 0x00 0x20 0x00 0x80 0x00 0x00 # fast singles
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x11 0x22 0x44 0x00 0x11 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # double spin ccw
	0x88 0x44 0x22 0x00 0x00 0x44 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # double spin cw

: octagon-edge # 32 {x,y} pairs along the rim of the outermost segments
	34  0  37  0  40  1  42  3  44  5  46  7  47 10  47 13
	47 18  47 21  46 24  44 26  42 28  40 30  37 31  34 31
	29 31  26 31  23 30  21 28  19 26  17 24  16 21  16 18
	16 13  16 10  17  7  19  5  21  3  23  1  26  0  29  0

:alias seg-x v2
:alias seg-y v3
: shift-splat
	v0 >>= v0
	if vf != 0 then sprite seg-x seg-y 0
;
:macro shift-part {
	:calc FRAME { TILE + 32 * ( CALLS % 8 ) }
	i := FRAME
	shift-splat
}
:macro shift-segment {
	:alias REG { ve - CALLS }
	:calc TILE { octagon-move + ( 32 * 8 ) * CALLS }
	v0 := REG
	shift-part
	shift-part
	shift-part
	shift-part
	shift-part
	shift-part
	shift-part
	shift-part
	REG <<= REG
	pattern >>= pattern
	if vf == 1 begin
		REG |= vf
		:calc TILE { octagon-start + 32 * CALLS }
		i := TILE
		sprite seg-x seg-y 0
	end
}
: animate-board
	i := patterns-A
	i += pattern-index
	load v0
	pattern := v0
	pattern-index += 1
	vf := 0b11111
	vf &= pattern-index
	if vf == 31 begin
		# randomize pattern source
		vf := random 1
		if vf == 0 begin
			:unpack 0xA patterns-A
		else
			:unpack 0xA patterns-B
		end
		i := animate-board
		save v1
		# increment wave counter
		vf := 0b1111
		vf &= pattern-index
		if vf == 15 begin
			i := waves
			load v0
			v0 += 1
			i := waves
			save v0
		end
	end
	seg-x := 24 seg-y :=  0  shift-segment
	seg-x := 32              shift-segment
	            seg-y :=  8  shift-segment
	            seg-y := 16  shift-segment
	seg-x := 24              shift-segment
	seg-x := 16              shift-segment
	            seg-y :=  8  shift-segment
	            seg-y :=  0  shift-segment
;
: draw-player
	i := octagon-edge
	i += player
	load v1
	i := pixel
	sprite v0 v1 1
;
: reset
	v0 := 0
	i := waves
	save v0
	i := reset-registers
	load vf
	clear
	draw-player
;
: move-player
	draw-player
	vf := OCTO_KEY_A  if vf key then player -= 2
	vf := OCTO_KEY_D  if vf key then player += 2
	vf := 0b00111111
	player &= vf # index modulo 64
	draw-player
	if vf != 0 begin
		vf := 30
		buzzer := vf
		delay  := vf
		wait
		vf := OCTO_KEY_A loop if vf key then again
		vf := OCTO_KEY_D loop if vf key then again
		clear

		# display wave count
		i := waves
		load v0
		i := wave-digits
		bcd v0
		load v2
		v3 := 25
		v4 := 12
		i := bighex v1
		sprite v3 v4 10
		v3 += 8
		i := bighex v2
		sprite v3 v4 10
		vf := key
		reset
	end
: wait
	loop
		vf := delay
		if vf != 0 then
	again
	vf := 4
	delay := vf
;
: main
	v0 := 16
	v1 :=  8
	i := title-A
	sprite v0 v1 0
	v0 += 16
	i := title-B
	sprite v0 v1 0
	loop
		animate-board
		vf := 0b00111111
		pattern-index &= vf
		wait
		vf := OCTO_KEY_A while vf -key
		wait
		vf := OCTO_KEY_D while vf -key
	again
	reset
	loop
		animate-board
		move-player
		move-player
	again
